package cn.wolfcode.service;

import cn.wolfcode.domain.IntergralPayResult;
import cn.wolfcode.domain.OperateIntergralVo;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

@LocalTCC
public interface IUsableIntegralService {

    //useTCCFence = true 表示开启 TCC 实现防空回滚，悬挂，幂等
    @TwoPhaseBusinessAction(
            name = "tryIntergralPay",
            commitMethod = "confirmIntergralPay",
            rollbackMethod = "cancelIntergralPay",
            useTCCFence = true
    )
    IntergralPayResult tryIntergralPay(BusinessActionContext ctx, @BusinessActionContextParameter("intergralVo") OperateIntergralVo intergralVo);

    void confirmIntergralPay(BusinessActionContext ctx);

    void cancelIntergralPay(BusinessActionContext ctx);


    /**
     * TCC一阶段 try操作：积分资源预留 即：冻结金额
     *
     * @param intergralVo 积分扣除对象
     * @param ctx         积分事务上下文对象
     * @return orderNo 订单编号
     */
    @TwoPhaseBusinessAction(
            name = "tryPayment",
            commitMethod = "commitPayment",
            rollbackMethod = "rollbackPayment"
    )
    IntergralPayResult tryPayment(@BusinessActionContextParameter(paramName = "intergralVo") OperateIntergralVo intergralVo, BusinessActionContext ctx);

    /**
     * 全局事务调用我们提供的commitPayment方法进行提交操作
     * TCC 二阶段 commit操作：真正对积分进行扣除操作，同时对冻结金额的扣除
     *
     * @param ctx 事务上下文对象
     * @return
     */
    void commitPayment(BusinessActionContext ctx);

    /**
     * 全局事务调用我们提供的rollbackPayment方法进行回滚操作
     * TCC 二阶段 rollback操作：当commit执行异常，则进行一阶段资源预留进行回滚操作，即：冻结金额减回
     *
     * @param ctx 事务上下文对象
     */
    void rollbackPayment(BusinessActionContext ctx);

    /**
     * 积分支付
     *
     * @param intergralVo
     * @return
     */
    IntergralPayResult pay(OperateIntergralVo intergralVo);

    /**
     * 积分退款
     *
     * @param intergralVo
     * @return
     */
    Boolean refund(OperateIntergralVo intergralVo);
}
